package com.bci.pwtz.controller;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.bci.pwtz.common.util.PaginationList;
import com.bci.pwtz.common.util.PwtzUtils;
import com.bci.pwtz.exception.CanNotDeleteException;
import com.bci.pwtz.exception.PwtzDatabaseException;
import com.bci.pwtz.mysql.model.CompanyUser;
import com.bci.pwtz.mysql.model.Dybx;
import com.bci.pwtz.mysql.model.Dyxl;
import com.bci.pwtz.service.BusinessCommonService;
import com.bci.pwtz.service.DybxService;
import com.bci.pwtz.service.DyxlService;

@Controller
@RequestMapping("/user/dybx")
public class DybxController extends AbstractController {
    @Autowired
    private DybxService service;
    @Autowired
    private DyxlService rService;
    @Autowired
    private BusinessCommonService businessCommonService;

    @RequestMapping(value = "/list", method = RequestMethod.POST)
    @ResponseBody
    public PaginationList<Dybx> list(String parentDeviceId, String deviceName, int pageSize, int pageNo) {
        PaginationList<Dybx> list = new PaginationList<Dybx>();
        try {
            Long companyid = getLastCompanyId();
            list = service.findDybx(deviceName, companyid, 0, null, parentDeviceId, null, null, pageSize, pageNo);
            if (list != null && list.getTotalRecord() > 0) {
                for (Dybx d : list.getRecords()) {
                    Dyxl obj = rService.load(d.getLinecode());
                    d.setLinecode(obj.getDevicename());
                }
            }
        } catch (PwtzDatabaseException e) {
            e.printStackTrace();
        }
        return list;
    }

    @RequestMapping(value = "/load", method = RequestMethod.POST)
    @ResponseBody
    public Dybx load(String deviceid) {
        Dybx rtObj = new Dybx();
        try {
            if (deviceid != null) {
                rtObj = service.load(deviceid);
            }
        } catch (PwtzDatabaseException e) {
            e.printStackTrace();
        }
        return rtObj;
    }

    @RequestMapping(value = "/edite", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, String> edite(String data) {
        Map<String, String> map = new HashMap<String, String>();
        try {
            //data=java.net.URLDecoder.decode(data,"UTF-8");
            String[] list = decodeURL(data.split("&"));
            for (int i = 0; i < list.length; i++) {
                String[] array = list[i].split("=");
                if (array.length == 1) {
                    map.put(array[0], "");
                } else {
                    map.put(array[0], array[1]);
                }
            }
            int retCount = businessCommonService.getCountByDeviceName(getLastCompanyId(), (long) AbstractController.低压表箱, map.get("devicename"), map.get("deviceid"));
            if (retCount > 0) {
                map = packageAjaxReturnMap(ERROR_VALUE_OP_RESULT_FAIL, ERROR_VALUE_MSG_TYPE_ERROR, null, "名称已存在！");
                return map;
            }
            CompanyUser user = (CompanyUser) session.getAttribute("user");
            Dybx device = new Dybx();
            device.setDeviceid(map.get("deviceid"));
            device.setDevicename(map.get("devicename"));
            device.setAltitude(map.get("altitude"));
            device.setCommissioningdate(map.get("commissioningdate"));
            device.setCompanyid(user.getLastCompanyId());
            device.setCreateid(user.getCompanyUserId());
            device.setDevicenumber(map.get("devicenumber"));
            device.setEquipmentstate(map.get("equipmentstate"));
            device.setFactorydate(map.get("factorydate"));
            device.setLastoperatorid(user.getCompanyUserId());
            device.setLatitude(map.get("latitude"));
            device.setLinecode(map.get("linecode"));
            device.setLocalcity(map.get("localcity"));
            device.setLongitude(map.get("longitude"));
            device.setMaintenanceteam(map.get("maintenanceteam"));
            device.setModel(map.get("model"));
            device.setOperationstate(map.get("operationstate"));
            device.setOperationunit(map.get("operationunit"));
            device.setProductionfactory(map.get("productionfactory"));
            device.setSerialnumber(map.get("serialnumber"));
            device.setSyncstatus(0);
            device.setVoltagelevel(map.get("voltagelevel"));
            device.setPredevicetype(PwtzUtils.passInt(map.get("predevicetype")));
            device.setPredevicecode(map.get("predevicecode"));
            device.setRatedcurrent(PwtzUtils.passDouble(map.get("ratedcurrent")));
            device.setRatedvoltage(map.get("ratedvoltage"));
            device.setBxcode(map.get("bxcode"));
            int ret = service.update(device);
            if (ret > 0) {
                setLog(device.getDeviceid(), device.getCompanyid(), AbstractController.低压表箱, AbstractController.update, "修改低压表箱[" + device.getDevicename() + "]成功", getUserId());
                map = packageAjaxReturnMap(ERROR_VALUE_OP_RESULT_SUCCESS, ERROR_VALUE_MSG_TYPE_INFO, null, "编辑低压表箱成功");
                map.put("deviceid", device.getDeviceid());
            } else {
                map = packageAjaxReturnMap(ERROR_VALUE_OP_RESULT_FAIL, ERROR_VALUE_MSG_TYPE_ERROR, null, "编辑低压表箱失败");
            }
        } catch (PwtzDatabaseException e) {
            map = packageException(e);
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return map;
    }

    @RequestMapping(value = "/add", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, String> add(String data) {
        Map<String, String> map = new HashMap<String, String>();
        try {
            //data=java.net.URLDecoder.decode(data,"UTF-8");
            String[] list = decodeURL(data.split("&"));
            for (int i = 0; i < list.length; i++) {
                String[] array = list[i].split("=");
                if (array.length == 1) {
                    map.put(array[0], "");
                } else {
                    map.put(array[0], array[1]);
                }
            }
            int retCount = businessCommonService.getCountByDeviceName(getLastCompanyId(), (long) AbstractController.低压表箱, map.get("devicename"));
            if (retCount > 0) {
                map = packageAjaxReturnMap(ERROR_VALUE_OP_RESULT_FAIL, ERROR_VALUE_MSG_TYPE_ERROR, null, "名称已存在！");
                return map;
            }
            CompanyUser user = (CompanyUser) session.getAttribute("user");
            Dybx device = new Dybx();
            UUID uuid = UUID.randomUUID();
            device.setDeviceid(uuid.toString());
            device.setDevicename(map.get("devicename"));
            device.setAltitude(map.get("altitude"));
            device.setCommissioningdate(map.get("commissioningdate"));
            device.setCompanyid(user.getLastCompanyId());
            device.setCreateid(user.getCompanyUserId());
            device.setDevicenumber(map.get("devicenumber"));
            device.setEquipmentstate(map.get("equipmentstate"));
            device.setFactorydate(map.get("factorydate"));
            device.setLastoperatorid(user.getCompanyUserId());
            device.setLatitude(map.get("latitude"));
            device.setLinecode(map.get("linecode"));
            device.setLocalcity(map.get("localcity"));
            device.setLongitude(map.get("longitude"));
            device.setMaintenanceteam(map.get("maintenanceteam"));
            device.setModel(map.get("model"));
            device.setOperationstate(map.get("operationstate"));
            device.setOperationunit(map.get("operationunit"));
            device.setProductionfactory(map.get("productionfactory"));
            device.setSerialnumber(map.get("serialnumber"));
            device.setSyncstatus(0);
            device.setVoltagelevel(map.get("voltagelevel"));
            device.setPredevicetype(PwtzUtils.passInt(map.get("predevicetype")));
            device.setPredevicecode(map.get("predevicecode"));
            device.setRatedcurrent(PwtzUtils.passDouble(map.get("ratedcurrent")));
            device.setRatedvoltage(map.get("ratedvoltage"));
            device.setBxcode(map.get("bxcode"));
            Dybx ret = service.add(device);
            if (ret != null) {
                setLog(device.getDeviceid(), device.getCompanyid(), AbstractController.低压表箱, AbstractController.add, "添加低压表箱[" + device.getDevicename() + "]成功", getUserId());
                map = packageAjaxReturnMap(ERROR_VALUE_OP_RESULT_SUCCESS, ERROR_VALUE_MSG_TYPE_INFO, null, "添加低压表箱成功");
                map.put("deviceid", device.getDeviceid());
            } else {
                map = packageAjaxReturnMap(ERROR_VALUE_OP_RESULT_FAIL, ERROR_VALUE_MSG_TYPE_ERROR, null, "添加低压表箱失败");
            }
        } catch (PwtzDatabaseException e) {
            map = packageException(e);
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return map;
    }

    @RequestMapping(value = "/delete", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, String> delete(String deviceid) {
        Map<String, String> map = new HashMap<String, String>();
        int result = 0;
        try {
            Dybx device = service.load(deviceid);
            result = service.delete(deviceid);
            if (result > 0 && device != null) {
                setLog(device.getDeviceid(), device.getCompanyid(), AbstractController.低压表箱, AbstractController.delete, "删除低压表箱[" + device.getDevicename() + "]成功", getUserId());
                map = packageAjaxReturnMap(ERROR_VALUE_OP_RESULT_SUCCESS, ERROR_VALUE_MSG_TYPE_INFO, null, "删除低压表箱成功");
            } else {
                map = packageAjaxReturnMap(ERROR_VALUE_OP_RESULT_FAIL, ERROR_VALUE_MSG_TYPE_ERROR, null, "删除低压表箱失败");
            }
        } catch (PwtzDatabaseException e) {
            map = packageException(e);
        } catch (CanNotDeleteException e) {
            map = packageException(e);
        }
        return map;
    }
}